package com.shujia.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Demo11Action {
  def main(args: Array[String]): Unit = {
    //1、创建spark环境
    //创建配置文件对象
    val conf = new SparkConf()
    //指定spark执行默认，local：本地执行
    conf.setMaster("local")
    //spark 任务名
    conf.setAppName("wc")
    //创建spark上下文对象
    val sc = new SparkContext(conf)

    val linesRDD: RDD[String] = sc.textFile("spark/data/students.csv")

    /**
     * count: 统计rdd的行数
     */
    val num: Long = linesRDD.count()
    println(num)

    /**
     * foreach: 循环打印结果
     */

    linesRDD.foreach(println)

    /**
     * collect;将RDD的数据拉取到内存中
     */
    val stuArray: Array[String] = linesRDD.collect()
    println(stuArray.toList)

    val intRDD: RDD[Int] = sc.parallelize(List(1, 2, 3, 4, 5, 5, 6, 7))
    /**
     * sum: 求和，只能对数值类型的数据求和
     */
    val sum: Double = intRDD.sum()
    println(sum)

    /**
     * reduce: 全局聚合
     */
    val reduce: Int = intRDD.reduce((x, y) => x + y)
    println(reduce)

    /**
     * saveAsTextFile: 将rdd的数据保存到文件中
     */
    intRDD.saveAsTextFile("spark/data/rdd")

    /**
     * 转换算子和操作算子的区别
     * 1、转换算子返回一个新的RDD,操作算子不返回RDD
     * 2、操作算子会触发任务的执行，每一个操作算子都会触发一个JOB执行
     * 3、转换算子懒执行，需要操作算子触发执行
     */

    while (true){}
  }
}
